package utils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;


/**
 * 文件上传、删除公共方法
 * @author xuyang
 *
 */
public class FilesUpload {
	public static Logger		logger	= Logger.getLogger( FilesUpload.class );
	public static ResourceBundle	rb	= ResourceBundle.getBundle( "configuration" );


	/**
	 * 单文件上传
	 *
	 * @param file
	 *            文件
	 * @param map
	 *            上传静态数据（资料类型：fileType、贷款ID：loan_id、所属类别：category、
	 *            是否必填：required、文件所属中文名称：tagName、是否为PDF：isPDF）
	 * @param req
	 *            数据参数
	 * @return
	 */
	public static String getSaveFile( MultipartFile file,Map<String,String> map, HttpServletRequest req )
	{
		/*资料类型*/
		String fileType = map.get("fileType");
		/*贷款ID*/
		String loan_id  = map.get("loan_id");
		/*所属类别*/
		String category = map.get("category");
		/* 是否必填*/
		String required = map.get("required");
		/*文件所属中文名称*/
		String tagName = map.get("tagName");
		/*是否为PDF*/
		String isPDF = map.get("isPDF");
		
		logger.info( "文件上传" );
		String mapInteger = "";
		if ( !file.isEmpty() )
		{
			try {
				/*
				 * 文件保存路径
				 * req.getSession().getServletContext().getRealPath("/resources/upload/");
				 */
				String filePath = rb.getString( "configuration" ) + loan_id;
				/*
				 * req.getSession().getServletContext().getRealPath("/resources/upload/"+
				 * loan_id);
				 * "D:/fileupload/" + loan_id;// 拼接路径
				 */
				FileUtils.copyInputStreamToFile( file.getInputStream(),
								 new File( filePath + "/" + file.getOriginalFilename() ) );
				logger.info( "true" );

				logger.info( "path:" + filePath );
				Map<String, Object> mapI = new HashMap<String, Object>();
				mapI.put( "type", "I" );
				mapI.put( "table", "vault_loan_file" );
				String[] valus = { "loanID==>" + loan_id,			      "fileType==>'" + fileType + "'",
						   "required==>'" + required + "'",		      "category==>'" + category + "'",
						   "fileName==>'" + file.getOriginalFilename() + "'", "link==>'" + filePath + "'",    "isDelete==>0",
						   "tagName==>'" + tagName + "'",		      "isPDF==>" + isPDF };
				mapI.put( "valus", valus );
//				mapInteger = (String) DBsqlLoan.publicMethod( mapI );
				/* 转存文件 */
				logger.info( "文件上传成功" + "success|" + mapInteger );
				return("success|" + mapInteger);
			} catch ( Exception e ) {
				logger.error( "文件上传失败:" + e.getMessage() );
				return("error");
			}
		} else {
			logger.info( "文件上传失败无文件" );
			return("error");
		}
	}


	/**
	 * 删除文件
	 *
	 * @param fName
	 *            文件名称
	 * @param paperFileName
	 *            文件夹名称
	 * @return
	 */
	public final static boolean deleteFileOrDirectory( HttpServletRequest request, String fName, String paperFileName )
	{
		/* 文件路径 */
		String filedir = request.getSession().getServletContext().getRealPath( "/" ) + "uploads/" + paperFileName + "/"
				 + fName;
		/* 文件夹 */
		String directorydir = request.getSession().getServletContext().getRealPath( "/" ) + "uploads/" + paperFileName;
		/* 保存文件 文件夹路径 */
		String	rootPath	= request.getSession().getServletContext().getRealPath( "/" ) + "uploads";
		File	file		= new File( filedir );
		if ( !file.exists() )
		{
			/* "删除文件失败："+fName+"文件不存在"; */
			return(false);
		} else {
			/* 删除所有空文件夹 */
			List<File> list = getAllNullDirectorys( new File( rootPath ) );
			removeNullFile( list, rootPath );
			if ( file.isFile() )
			{
				return(deleteFile( filedir ) );                 /* 删除单个文件 */
			} else {
				return(deleteDirectory( directorydir ) );       /* 删除目录（文件夹）以及目录下的文件 */
			}
		}
	}


	/**
	 * 删除单个文件
	 *
	 * @param fileName
	 *            被删除文件的文件名
	 * @return 单个文件删除成功返回true,否则返回false
	 */
	public static boolean deleteFile( String fileName )
	{
		File file = new File( fileName );
		if ( file.isFile() && file.exists() )
		{
			file.delete(); /* "删除单个文件"+name+"成功！" */
			return(true);
		} /* "删除单个文件"+name+"失败！" */
		return(false);
	}


	/**
	 * 删除目录（文件夹）以及目录下的文件
	 *
	 * @param dir
	 *            被删除目录的文件路径
	 * @return 目录删除成功返回true,否则返回false
	 */
	public static boolean deleteDirectory( String directorydir )
	{
		/* 如果dir不以文件分隔符结尾，自动添加文件分隔符 */
		if ( !directorydir.endsWith( File.separator ) )
		{
			directorydir = directorydir + File.separator;
		}
		File dirFile = new File( directorydir );
		/* 如果dir对应的文件不存在，或者不是一个目录，则退出 */
		if ( !dirFile.exists() || !dirFile.isDirectory() )
		{
			/* "删除目录失败"+name+"目录不存在！" */
			return(false);
		}
		boolean flag = true;
		/* 删除文件夹下的所有文件(包括子目录) */
		File[] files = dirFile.listFiles();
		for ( int i = 0; i < files.length; i++ )
		{
			/* 删除子文件 */
			if ( files[i].isFile() )
			{
				flag = deleteFile( files[i].getAbsolutePath() );
				if ( !flag )
				{
					break;
				}
			}
			/* 删除子目录 */
			else {
				flag = deleteDirectory( files[i].getAbsolutePath() );
				if ( !flag )
				{
					break;
				}
			}
		}

		if ( !flag )
		{
			return(false);
		}

		/* 删除当前目录 */
		if ( dirFile.delete() )
		{
			return(true);
		} else {
			return(false);
		}
	}


	/* 删除文件夹 folderPath 文件夹完整绝对路径 */
	public static void delFolder( String folderPath )
	{
		try {
			delAllFile( folderPath );       /* 删除完里面所有内容 */
			String filePath = folderPath;
			filePath = filePath.toString();
			java.io.File myFilePath = new java.io.File( filePath );
			myFilePath.delete();            /* 删除空文件夹 */
		} catch ( Exception e ) {
			e.printStackTrace();
		}
	}


	/* 删除指定文件夹下所有文件 path 文件夹完整绝对路径 */
	public static boolean delAllFile( String path )
	{
		boolean flag	= false;
		File	file	= new File( path );
		if ( !file.exists() )
		{
			return(flag);
		}
		if ( !file.isDirectory() ) /* 判断该路径是否是一个目录 */
		{
			return(flag);
		}
		String[] tempList = file.list();
		File temp = null;
		for ( int i = 0; i < tempList.length; i++ )
		{
			if ( path.endsWith( File.separator ) )
			{
				temp = new File( path + tempList[i] );
			} else {
				temp = new File( path + File.separator + tempList[i] );
			}
			if ( temp.isFile() )
			{
				temp.delete();
			}
			if ( temp.isDirectory() )
			{
				delAllFile( path + "/" + tempList[i] ); /* 先删除文件夹里面的文件 */
				delFolder( path + "/" + tempList[i] );  /* 再删除空文件夹 */
				flag = true;
			}
		}
		return(flag);
	}

	/**
	 * 递归列出某文件夹下的最深层的空文件夹绝对路径，储存至list
	 *
	 * @param root
	 * @return
	 */
	public static List<File> getAllNullDirectorys( File root )
	{
		List<File> list = new ArrayList<File>();
		File[] dirs = root.listFiles();
		if ( dirs != null )
		{
			for ( int i = 0; i < dirs.length; i++ )
			{
				if ( dirs[i].isDirectory() && dirs[i].listFiles().length == 0 )
				{
					list.add( dirs[i] );
				}
				list.addAll( getAllNullDirectorys( dirs[i] ) );
			}
		}
		return(list);
	}


	/**
	 * 由最深一层的空文件，向上（父文件夹）递归，删除空文件夹
	 *
	 * @param list
	 * @param rootPath
	 */
	public static void removeNullFile( List<File> list, String rootPath )
	{
		if ( list == null || list.size() == 0 )
		{
			return;
		}
		List<File> plist = new ArrayList<File>();
		for ( int i = 0; i < list.size(); i++ )
		{
			File temp = list.get( i );
			if ( temp.isDirectory() && temp.listFiles().length <= 0 )
			{
				temp.delete();
				File pFile = temp.getParentFile();
				if ( pFile.getPath().equals( rootPath ) )
				{
					continue;
				}
				if ( !plist.contains( pFile ) ) /* 父目录去重添加 */
				{
					plist.add( pFile );
				}
			}
		}
		removeNullFile( plist, rootPath );
	}


	/**
	 * 文件批量上传-备用
	 *
	 * @param file
	 * @param str
	 * @param chineseName
	 * @param req
	 * @return
	 * @throws IOException
	 */
	public static boolean getFilesUpload( MultipartFile[] file, String loan_id, HttpServletRequest req )
	throws IOException
	{
		try {
			for ( MultipartFile photo : file )
			{
				if ( photo.isEmpty() )
					continue;
				String realpath = "D:/fileupload/" + loan_id;
				FileUtils.copyInputStreamToFile( photo.getInputStream(),
								 new File( realpath + "/" + photo.getOriginalFilename() ) );
			}
		} catch ( Exception e ) {
			return(false);
		}
		return(true);
	}
}
